#ifndef BOOK_H
#define BOOK_H

#include <QMainWindow>
#include <QUrl>
#include <QQueue>
#include <QList>
#include<QStringList>
#include <QNetworkAccessManager>
#include<QNetworkReply>
#include<QNetworkRequest>
#include <QFileDialog>
#include<QStandardItemModel>
#include<QStringListModel>//存储简单的string列表
namespace Ui {
class Book;
}

class Book : public QMainWindow
{
    Q_OBJECT

public:
    explicit Book(QWidget *parent = nullptr);
    ~Book();

private slots:

    void on_searchbtn_clicked();

    void on_filepathbtn_clicked();

    void on_updatebtn_clicked();

    void on_urlbtn_clicked();


//
//    void on_downloadbtn_clicked();





    void on_pausebtn_clicked();

    void on_downloadbtn_clicked();

public:
    //下载的函数
    void downLoadAction(const QUrl url,const QString filepath,const QString filename);
    //分块下载的函数
    void downLoadAction_2(const QUrl url,const QString filepath,const QString filename);
    //分成100个块下载
    void downLoadAction_3(const QUrl url,const QString filepath,const QString filename);

    //客户端发送请求，请求中为文件服务器的文件路径，接收参数为所有的文件名，文件名用一个可变的容器存储
    void fileListShow();
    //槽函数
    void on_listview_clicked();
    //计算文件大小
    void getFileSize();
    //设置文件请求头的参数
    void setHeadRange();



    //下载进度条的槽函数
    void on_downloadprogress();
    void caluculateMd5();

public :
    int progressvalue = 0;
    QString filepath;//下载文件要存储的路径，只有一个
    QString filename;
    qint64 filesize=0;
    QStringList filenames;//许多个文件名
    QStringListModel *model;
    QStandardItemModel* model1;
    qint64 totalblocks=99;
    //全局唯一一个网络管理manager
    QNetworkAccessManager * manager;
    qint64 currentoffset=0;
    //const qint64 blocksize=1024*1024;//默认块大小为1MB
    QQueue<QPair<qint64,qint64>> requestqueue;
    //下载暂停的槽函数
    void on_downLoadPause();
    //一个bool型的flag判断是否暂停,默认是不暂停，继续下载的
    bool downloadstatus=true;

    class FileInfo{
    //这是一个用于记录文件信息的类,每个文件信息会有属性：文件名，医生，患者，设计类型
    QString filename_2;
    QString doctor;
    QString patient;
    QString designtype;
    };


private:
    Ui::Book *ui;

signals:
    //这是一个文件下载暂停的信号
    void downLoadPause();

};

#endif // BOOK_H
